En este ejercicio vas a trabajar el concepto de herencia un poco más en profundidad, aprovechando para introducir un nuevo concepto muy importante que te facilitará mucho la vida.
Hasta ahora sabemos que una clase heredada puede fácilmente extender algunas funcionalidades, simplemente añadiendo nuevos atributos y métodos, o sobreescribiendo los ya existentes. Como en el siguiente ejemplo
In [35]:
class Vehiculo():
def __init__(self, color, ruedas):
self.color = color
self.ruedas = ruedas
def __str__(self):
return "color {}, {} ruedas".format( self.color, self.ruedas )
class Coche(Vehiculo):
def __init__(self, color, ruedas, velocidad, cilindrada):
self.color = color
self.ruedas = ruedas
self.velocidad = velocidad
self.cilindrada = cilindrada
def __str__(self):
return "color {}, {} km/h, {} ruedas, {} cc".format( self.color, self.velocidad, self.ruedas, self.cilindrada )
c = Coche("azul", 150, 4, 1200)
print(c)
El inconveniente más evidente de ir sobreescribiendo es que tenemos que volver a escribir el código de la superclase y luego el específico de la subclase.
Para evitarnos escribir código innecesario, podemos utilizar un truco que consiste en llamar el método de la superclase y luego simplemente escribir el código de la clase:
In [36]:
class Vehiculo():
def __init__(self, color, ruedas):
self.color = color
self.ruedas = ruedas
def __str__(self):
return "color {}, {} ruedas".format( self.color, self.ruedas )
class Coche(Vehiculo):
def __init__(self, color, ruedas, velocidad, cilindrada):
Vehiculo.__init__(self, color, ruedas)
self.velocidad = velocidad
self.cilindrada = cilindrada
def __str__(self):
return Vehiculo.__str__(self) + ", {} km/h, {} cc".format(self.velocidad, self.cilindrada)
c = Coche("azul", 4, 150, 1200)
print(c)
Como tener que determinar constantemente la superclase puede ser fastidioso, Python nos permite utilizar un acceso directo mucho más cómodo llamada super().
Hacerlo de esta forma además nos permite llamar cómodamente los métodos o atributos de la superclase sin necesidad de especificar el self.
In [4]:
class Vehiculo():
def __init__(self, color, ruedas):
self.color = color
self.ruedas = ruedas
def __str__(self):
return "color {}, {} ruedas".format( self.color, self.ruedas )
class Coche(Vehiculo):
def __init__(self, color, ruedas, velocidad, cilindrada):
super().__init__(color, ruedas) # utilizamos super() sin self en lugar de Vehiculo
self.velocidad = velocidad
self.cilindrada = cilindrada
def __str__(self):
return super().__str__() + ", {} km/h, {} cc".format(self.velocidad, self.cilindrada)
c = Coche("azul", 4, 150, 1200)
print(c)
Utilizando esta nueva técnica, extiende la clase Vehiculo y realiza la siguiente implementación:
Recordatorio: Puedes utilizar el atributo especial de clase name de la siguiente forma para recuperar el nombre de la clase de un objeto:
type(objeto).__name__
In [14]:
class Vehiculo():
def __init__(self, color, ruedas):
self.color = color
self.ruedas = ruedas
def __str__(self):
return "color {}, {} ruedas".format( self.color, self.ruedas )
class Coche(Vehiculo):
def __init__(self, color, ruedas, velocidad, cilindrada):
super().__init__(color, ruedas) # utilizamos super() sin self en lugar de Vehiculo
self.velocidad = velocidad
self.cilindrada = cilindrada
def __str__(self):
return super().__str__() + ", {} km/h, {} cc".format(self.velocidad, self.cilindrada)
# Completa el ejercicio aquí
class Camioneta():
pass
class Bicicleta():
pass
class Motocicleta():
pass
def catalogar():
pass
def catalogar():
pass